package com.sky.service.wx_user.impl;

import com.sky.entity.Dish;
import com.sky.entity.DishFlavor;
import com.sky.mapper.WXDishMapper;
import com.sky.service.wx_user.WXDishService;
import com.sky.vo.DishVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class WXDishServiceImpl implements WXDishService {
    @Autowired
    private WXDishMapper wxDishMapper;

    /**
     * 根据条件查询菜品列表，并且每个菜品都需要附带其对应的口味列表
     * @param dish 这是一个查询条件对象。比如，如果 dish 对象的 categoryId 属性有值，
     *             那么就代表要查询这个分类下的所有菜品。
     * @return 返回一个列表，列表中的每个元素都是一个 DishVO 对象。
     *         DishVO 对象不仅包含菜品的基本信息，还包含一个口味列表（flavors）。
     */
    @Override
    public List<DishVO> list(Dish dish) {
        // 1. 【第一步：查询菜品基础信息】
        // 根据传入的条件（比如分类ID），从数据库的 dish 表中查询出所有符合条件的菜品列表。
        // 注意：这个时候查出来的 Dish 对象，内部是不包含口味信息的。
        List<Dish> list = wxDishMapper.list(dish);
        // 2. 【第二步：准备最终结果容器】
        // 创建一个新的、空的列表，这个列表将用来存放我们最终要返回给前端的 DishVO 对象。
        // DishVO 是一个“视图对象”，专门为了满足前端展示需求而设计。
        List<DishVO> dishVOList = new ArrayList<>();
        // 3. 【第三步：遍历每个菜品，为其追加口味信息】
        // 开始一个循环，逐一处理上面从数据库查出来的每一个菜品（Dish 对象）。
        for (Dish d : list) {
            // --- 对于每一个菜品，我们都要进行以下组装操作 ---
            // 3.1 创建一个用于前端展示的 DishVO 对象
            DishVO dishVO = new DishVO();
            // 3.2 复制基础属性
            // 使用工具类 BeanUtils，将当前菜品 d 的所有同名属性（如 name, price, image等）
            // 快速复制到新建的 dishVO 对象中。这比手动一个一个 set 属性要高效得多。
            BeanUtils.copyProperties(d, dishVO);
            // 3.3 查询当前菜品对应的口味数据
            // 使用当前菜品的 ID (d.getId())，去数据库的 dish_flavor 表中查询所有属于这个菜品的口味。
            // 比如，查询ID为10的菜品（宫保鸡丁），可能会查出“微辣”、“中辣”、“特辣”等口味。
            List<DishFlavor> flavors = wxDishMapper.selectByDishId(d.getId());
            // 3.4 将口味数据设置到 DishVO 中
            // 将刚刚查询到的口味列表（flavors）设置到 dishVO 对象的 flavors 属性中。
            dishVO.setFlavors(flavors);
            // 3.5 将组装完毕的 DishVO 添加到最终结果列表中
            // 现在，这个 dishVO 对象已经是一个完整的、既包含菜品信息又包含口味信息的对象了。
            // 将它添加到我们准备好的 dishVOList 列表中。
            dishVOList.add(dishVO);
        }
        // 4. 【第四步：返回最终的完整数据】
        // 当循环结束后，dishVOList 中就包含了所有查询到的、并且已经组装好口味信息的菜品。
        // 将这个完整的列表返回。
        return dishVOList;
    }
}
